package common

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// JsonStruct
/*
1.使用反引号（`）来定义结构体字段的 JSON 标签是为了指定这些字段在 JSON 数据中的键名。它们帮助在 JSON 编码和解码时映射 Go 结构体字段与 JSON 键的对应关系
2. json:"data"
作用: 指定这个字段在 JSON 对象中的键名是 "data"。
示例: 如果将 JsonStruct 实例编码成 JSON，Data 字段会被转换为 {"data": [1, 2, 3]}，其中 [1, 2, 3] 可以是任意类型的数据（如数字、字符串、结构体等）。
3.类型: interface{}，表示可以接受任何类型的值。Go 的 interface{} 是一个空接口，可以存储任意类型的数据 类似：any
*/
type JsonStruct struct {
	Code int         `json:"code"`
	Msg  interface{} `json:"msg"`
	Data interface{} `json:"data"`
}

type JsonErrorStruct struct {
	Code int         `json:"code"`
	Msg  interface{} `json:"msg"`
}

// TooManyRequestErrorJSON 接口限流中，请稍后再试
var TooManyRequestErrorJSON = &JsonErrorStruct{Code: http.StatusTooManyRequests, Msg: http.StatusText(http.StatusTooManyRequests) + " 接口限流中，请稍后再试"}

// ForBiddenErrorJSON 无权限访问
var ForBiddenErrorJSON = &JsonErrorStruct{Code: http.StatusUnauthorized, Msg: http.StatusText(http.StatusUnauthorized) + " 无权限访问"}

// ReturnSuccess 成功返回携带数据
func ReturnSuccess(routerServer *gin.Context, msg interface{}, data interface{}) {
	json := &JsonStruct{Code: http.StatusOK, Msg: msg, Data: data}
	routerServer.JSON(http.StatusOK, json)
}

// ReturnOkSuccess 成功返回
func ReturnOkSuccess(routerServer *gin.Context, data interface{}) {
	json := &JsonStruct{Code: http.StatusOK, Msg: "ok", Data: data}
	routerServer.JSON(http.StatusOK, json)
}

// ReturnError 服务器内部错误
func ReturnError(routerServer *gin.Context, msg string) {
	json := &JsonErrorStruct{Code: http.StatusInternalServerError, Msg: http.StatusText(http.StatusInternalServerError) + ": " + msg}
	routerServer.JSON(http.StatusInternalServerError, json)
}

// ReturnForBidden 无权限访问
func ReturnForBidden(routerServer *gin.Context, msg string) {
	json := &JsonErrorStruct{Code: http.StatusUnauthorized, Msg: http.StatusText(http.StatusUnauthorized) + ": " + msg}
	routerServer.JSON(http.StatusUnauthorized, json)
}
